/**
 * N-1个白球，1个黑球，黑球初始在位置1
 * 每一次选择a和b进行交换
 * 问K次以后黑球的位置的期望是多少
 * K在1E5，N在9E8
 * 
 * 令Di是第i次操作以后的位置
 * D0 = 1
 * Di = D[i - 1] * p + 2 * SIGMA{i} / N^2 - D[i-1] / N^2 
 * 其中p是选中零个黑球的概率，即 (n-1)/n * (n-1)/n
 * 第二项是至少选中一个黑球的情况，假设第一个选中黑球，第二个位置是等概率的[1, N]，
 * 因此期望每一种可能对期望的贡献是 i / N^2
 * 再考虑第二个选中黑球，第一个是其他，所以要乘2，这其中选中两个黑球的情况重复计算了，所以要减去
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using Real = long double;

llt const MOD = 998244353LL;

llt qpow(llt a, llt n){
    a %= MOD;
    llt ret = 1;
    while(n){
        if(n & 1) ret = ret * a % MOD; 
        a = a * a % MOD;
        n >>= 1;
    }
    return ret;
}

llt inv(llt a) {return qpow(a, MOD - 2LL);}

int N, K;
vll D;

void work(){ 
    cin >> N >> K;
    D.assign(K + 1, 0);
    D[0] = 1;

    llt nni = inv(N);
    llt p = ((N - 1LL) * (N - 1LL) % MOD - 1) % MOD;
    llt ni2 = nni * nni % MOD;
    p = p * ni2 % MOD;
    llt tmp = (N + 1) % MOD * nni % MOD;
    for(int i=1;i<=K;++i){
        D[i] = p * D[i - 1] % MOD;
        D[i] = (D[i] + tmp) % MOD;
    }
    auto ans = D[K];
    if(ans < 0) ans += MOD;
    cout << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}